/*
  中点法画圆形
  依旧是通过绘制圆形公式找出增量函数
*/
#include "OpenGLCase5.h"

// 方法三 
void drawCircle3(int cx, int cy, int r, HDC hdc) {
	// 对于圆存在 x２ + y２ = r２.那么 F(x, y) = x２ + y２ - r２ = 0;
	// 那么对于圆弧线上x最大位移的下一个点存在： F(x, y)  = 0  在圆上 ，  F(x, y) > 0 在圆外 ， F(x, y) < 0 在园内
	// 简化问题也只考虑圆上1/8段，那么 每次x 增加1， y是否减少1，,取决于中点 M 在不在圆内， M取值 M(xi + 1, yi - 0.5)
	// d=F(M) = (xi + 1)２ + (yi - 0.5)２ - r２
	// F（M旧） = (xi + 1)２ + (yi - 0.5)２ - r２
	// F（M新） = (xi + 2)２ + (yi - 0.5)２ - r２
	// △d = F(M新) - F(M旧) = 2 * xi + 3;
	// d的初值 P0 = （0，R） 所有圆都可以看做是在原点计算好弧线后在平移到对应中心点去
	// 带入到 F（x, y） 计算得到 d = 1.25 - R 由于只使用符号，所以可以替代为 d = d - 0.25;(这个是增量整数化只看符号，就是下一个减现在的点对应的D)

	int d = 1.25 - r;
	for (int x = 0, y = r; x < y; x++) {

		SetPixel(hdc, x + cx, y + cy, RGB(255, 255, 0));
		SetPixel(hdc, -x + cx, y + cy, RGB(255, 255, 0));

		SetPixel(hdc, x + cx, -y + cy, RGB(255, 255, 0));
		SetPixel(hdc, -x + cx, -y + cy, RGB(255, 255, 0));

		SetPixel(hdc, y + cx, x + cy, RGB(255, 255, 0));
		SetPixel(hdc, y + cx, -x + cy, RGB(255, 255, 0));

		SetPixel(hdc, -y + cx, x + cy, RGB(255, 255, 0));
		SetPixel(hdc, -y + cx, -x + cy, RGB(255, 255, 0));

		if (d <= 0) {
			d = d + 2 * x + 3;
		}else {
			d = d + 2 * (x - y) + 5;
			y--;
		}
	}

}


void runCase5() {

	// 获取一个可供画图的DC，我这里就直接用桌面算了
	HDC hdc = GetWindowDC(GetDesktopWindow());

	drawCircle3(700, 500, 100, hdc);

}